using System;
using System.Collections;
using System.Xml.Serialization;

namespace NCover.Report
{
	/// <summary>
	/// Summary description for CoverageNamespace.
	/// </summary>
	[Serializable]
	public class CoverageNamespace
	{
		public int PreviousHits;
		public int PreviousTotal;

		public void SetPrevious(CoverageNamespace cn)
		{
			PreviousHits = cn.HitCoveragePoints;
			PreviousTotal = cn.TotalCoveragePoints;

			NCover.NCoverCheck.Add(79); NCover.NCoverCheck.Add(78); NCover.NCoverCheck.Add(78); NCover.NCoverCheck.Add(77); NCover.NCoverCheck.Add(78); NCover.NCoverCheck.Add(78); NCover.NCoverCheck.Add(79); NCover.NCoverCheck.Add(79); NCover.NCoverCheck.Add(79); NCover.NCoverCheck.Add(79); NCover.NCoverCheck.Add(79); NCover.NCoverCheck.Add(79); NCover.NCoverCheck.Add(79); NCover.NCoverCheck.Add(79); foreach (CoverageFile cFile in Members)
			{
				CoverageFile prevFile = cn.GetCoverageFile(cFile.Filename);
				if (prevFile != null && NCover.NCoverCheck.Add(101) && NCover.NCoverCheck.Add(100) && NCover.NCoverCheck.Add(100) && NCover.NCoverCheck.Add(99) && NCover.NCoverCheck.Add(100) && NCover.NCoverCheck.Add(100) && NCover.NCoverCheck.Add(101) && NCover.NCoverCheck.Add(101) && NCover.NCoverCheck.Add(101) && NCover.NCoverCheck.Add(101) && NCover.NCoverCheck.Add(101) && NCover.NCoverCheck.Add(101) && NCover.NCoverCheck.Add(101) && NCover.NCoverCheck.Add(101))
				{
					cFile.SetPrevious(prevFile);
				}
			}
		}

		public const string DEFAULT_NAMESPACE = "Default Namespace";
		private CoverageNamespace _parent = null;
		private string _namespace = DEFAULT_NAMESPACE;
		ArrayList _children= new ArrayList(), _members = new ArrayList();


		public CoverageNamespace()
		{
			_namespace = DEFAULT_NAMESPACE;
		}

		public CoverageNamespace(CoverageNamespace parent, string name)
		{
			_parent = parent;
			Namespace = name;
		}

		public int TotalCoveragePoints
		{
			get { 
				int count = 0;

				NCover.NCoverCheck.Add(80); NCover.NCoverCheck.Add(79); NCover.NCoverCheck.Add(79); NCover.NCoverCheck.Add(78); NCover.NCoverCheck.Add(79); NCover.NCoverCheck.Add(79); NCover.NCoverCheck.Add(80); NCover.NCoverCheck.Add(80); NCover.NCoverCheck.Add(80); NCover.NCoverCheck.Add(80); NCover.NCoverCheck.Add(80); NCover.NCoverCheck.Add(80); NCover.NCoverCheck.Add(80); NCover.NCoverCheck.Add(80); foreach (CoverageFile file in _members)
				{
					count += file.CoveragePoints.Count;
				}
				NCover.NCoverCheck.Add(81); NCover.NCoverCheck.Add(80); NCover.NCoverCheck.Add(80); NCover.NCoverCheck.Add(79); NCover.NCoverCheck.Add(80); NCover.NCoverCheck.Add(80); NCover.NCoverCheck.Add(81); NCover.NCoverCheck.Add(81); NCover.NCoverCheck.Add(81); NCover.NCoverCheck.Add(81); NCover.NCoverCheck.Add(81); NCover.NCoverCheck.Add(81); NCover.NCoverCheck.Add(81); NCover.NCoverCheck.Add(81); return count; 
			}
			set 
			{
				//for serialiser
			}
		}

		public int HitCoveragePoints
		{
			get 
			{
				int hitCount = 0;
				NCover.NCoverCheck.Add(82); NCover.NCoverCheck.Add(81); NCover.NCoverCheck.Add(81); NCover.NCoverCheck.Add(80); NCover.NCoverCheck.Add(81); NCover.NCoverCheck.Add(81); NCover.NCoverCheck.Add(82); NCover.NCoverCheck.Add(82); NCover.NCoverCheck.Add(82); NCover.NCoverCheck.Add(82); NCover.NCoverCheck.Add(82); NCover.NCoverCheck.Add(82); NCover.NCoverCheck.Add(82); NCover.NCoverCheck.Add(82); foreach (CoverageFile file in _members)
				{
					hitCount += file.HitCoveragePoints;
				}

				NCover.NCoverCheck.Add(83); NCover.NCoverCheck.Add(82); NCover.NCoverCheck.Add(82); NCover.NCoverCheck.Add(81); NCover.NCoverCheck.Add(82); NCover.NCoverCheck.Add(82); NCover.NCoverCheck.Add(83); NCover.NCoverCheck.Add(83); NCover.NCoverCheck.Add(83); NCover.NCoverCheck.Add(83); NCover.NCoverCheck.Add(83); NCover.NCoverCheck.Add(83); NCover.NCoverCheck.Add(83); NCover.NCoverCheck.Add(83); return hitCount;
			}
			set
			{
				//for serialiser
			}
		}

		public decimal TestCoveragePercentage 
		{
			get {
				if (TotalCoveragePoints == 0 && NCover.NCoverCheck.Add(102) && NCover.NCoverCheck.Add(101) && NCover.NCoverCheck.Add(101) && NCover.NCoverCheck.Add(100) && NCover.NCoverCheck.Add(101) && NCover.NCoverCheck.Add(101) && NCover.NCoverCheck.Add(102) && NCover.NCoverCheck.Add(102) && NCover.NCoverCheck.Add(102) && NCover.NCoverCheck.Add(102) && NCover.NCoverCheck.Add(102) && NCover.NCoverCheck.Add(102) && NCover.NCoverCheck.Add(102) && NCover.NCoverCheck.Add(102))
					return 1;
				NCover.NCoverCheck.Add(84); NCover.NCoverCheck.Add(83); NCover.NCoverCheck.Add(83); NCover.NCoverCheck.Add(82); NCover.NCoverCheck.Add(83); NCover.NCoverCheck.Add(83); NCover.NCoverCheck.Add(84); NCover.NCoverCheck.Add(84); NCover.NCoverCheck.Add(84); NCover.NCoverCheck.Add(84); NCover.NCoverCheck.Add(84); NCover.NCoverCheck.Add(84); NCover.NCoverCheck.Add(84); NCover.NCoverCheck.Add(84); return ((decimal)HitCoveragePoints) / ((decimal)TotalCoveragePoints); 
			}
		}

		public bool isDecendentOfMe(CoverageNamespace cn)
		{
			NCover.NCoverCheck.Add(85); NCover.NCoverCheck.Add(84); NCover.NCoverCheck.Add(84); NCover.NCoverCheck.Add(83); NCover.NCoverCheck.Add(84); NCover.NCoverCheck.Add(84); NCover.NCoverCheck.Add(85); NCover.NCoverCheck.Add(85); NCover.NCoverCheck.Add(85); NCover.NCoverCheck.Add(85); NCover.NCoverCheck.Add(85); NCover.NCoverCheck.Add(85); NCover.NCoverCheck.Add(85); NCover.NCoverCheck.Add(85); return cn.Namespace.StartsWith(_namespace);
		}

		public CoverageNamespace GetNamespace(string[] names)
		{
			//Default namespace:
			if ((names == null || names.Length == 0 || (names.Length == 1 && names[0] == DEFAULT_NAMESPACE)) && DEFAULT_NAMESPACE == _namespace && NCover.NCoverCheck.Add(103))
				return this;

			//find namespace matching names[0]:
			foreach (CoverageNamespace cn in ChildNamespaces)
			{
				if (cn._namespace == names[0] && NCover.NCoverCheck.Add(104) && NCover.NCoverCheck.Add(102) && NCover.NCoverCheck.Add(102) && NCover.NCoverCheck.Add(101) && NCover.NCoverCheck.Add(102) && NCover.NCoverCheck.Add(102) && NCover.NCoverCheck.Add(103) && NCover.NCoverCheck.Add(103) && NCover.NCoverCheck.Add(103) && NCover.NCoverCheck.Add(103) && NCover.NCoverCheck.Add(103) && NCover.NCoverCheck.Add(103) && NCover.NCoverCheck.Add(103) && NCover.NCoverCheck.Add(103))
				{
					if (names.Length == 1 && NCover.NCoverCheck.Add(105) && NCover.NCoverCheck.Add(103) && NCover.NCoverCheck.Add(103) && NCover.NCoverCheck.Add(102) && NCover.NCoverCheck.Add(103) && NCover.NCoverCheck.Add(103) && NCover.NCoverCheck.Add(104) && NCover.NCoverCheck.Add(104) && NCover.NCoverCheck.Add(104) && NCover.NCoverCheck.Add(104) && NCover.NCoverCheck.Add(104) && NCover.NCoverCheck.Add(104) && NCover.NCoverCheck.Add(104) && NCover.NCoverCheck.Add(104))
					{
						NCover.NCoverCheck.Add(86); NCover.NCoverCheck.Add(85); NCover.NCoverCheck.Add(85); NCover.NCoverCheck.Add(84); NCover.NCoverCheck.Add(85); NCover.NCoverCheck.Add(85); NCover.NCoverCheck.Add(86); NCover.NCoverCheck.Add(86); NCover.NCoverCheck.Add(86); NCover.NCoverCheck.Add(86); NCover.NCoverCheck.Add(86); NCover.NCoverCheck.Add(86); NCover.NCoverCheck.Add(86); NCover.NCoverCheck.Add(86); return cn;
					}
					else
					{
						string[] next = new string[names.Length -1];
						Array.Copy(names, 1, next, 0, next.Length);
						NCover.NCoverCheck.Add(87); NCover.NCoverCheck.Add(86); NCover.NCoverCheck.Add(86); NCover.NCoverCheck.Add(85); NCover.NCoverCheck.Add(86); NCover.NCoverCheck.Add(86); NCover.NCoverCheck.Add(87); NCover.NCoverCheck.Add(87); NCover.NCoverCheck.Add(87); NCover.NCoverCheck.Add(87); NCover.NCoverCheck.Add(87); NCover.NCoverCheck.Add(87); NCover.NCoverCheck.Add(87); NCover.NCoverCheck.Add(87); return cn.GetNamespace(next);
					}				
				}
			}

			CoverageNamespace parent = this;
			NCover.NCoverCheck.Add(88); NCover.NCoverCheck.Add(87); NCover.NCoverCheck.Add(87); NCover.NCoverCheck.Add(86); NCover.NCoverCheck.Add(87); NCover.NCoverCheck.Add(87); NCover.NCoverCheck.Add(88); NCover.NCoverCheck.Add(88); NCover.NCoverCheck.Add(88); NCover.NCoverCheck.Add(88); NCover.NCoverCheck.Add(88); NCover.NCoverCheck.Add(88); NCover.NCoverCheck.Add(88); NCover.NCoverCheck.Add(88); foreach (string s in names)
			{
				CoverageNamespace child = new CoverageNamespace(parent, s);
				parent._children.Add(child);
				parent = child;
			}
			NCover.NCoverCheck.Add(89); NCover.NCoverCheck.Add(88); NCover.NCoverCheck.Add(88); NCover.NCoverCheck.Add(87); NCover.NCoverCheck.Add(88); NCover.NCoverCheck.Add(88); NCover.NCoverCheck.Add(89); NCover.NCoverCheck.Add(89); NCover.NCoverCheck.Add(89); NCover.NCoverCheck.Add(89); NCover.NCoverCheck.Add(89); NCover.NCoverCheck.Add(89); NCover.NCoverCheck.Add(89); NCover.NCoverCheck.Add(89); return parent;
		}

		public bool HasNamespace(string[] names)
		{
			//Default namespace:
			if ((names == null || names.Length == 0 || (names.Length == 1 && names[0] == DEFAULT_NAMESPACE)) && DEFAULT_NAMESPACE == _namespace && NCover.NCoverCheck.Add(106) && NCover.NCoverCheck.Add(104) && NCover.NCoverCheck.Add(104) && NCover.NCoverCheck.Add(103))
				return true;

			//find namespace matching names[0]:
			foreach (CoverageNamespace cn in ChildNamespaces)
			{
				if (cn._namespace == names[0] && NCover.NCoverCheck.Add(107) && NCover.NCoverCheck.Add(105) && NCover.NCoverCheck.Add(105) && NCover.NCoverCheck.Add(104) && NCover.NCoverCheck.Add(104) && NCover.NCoverCheck.Add(104) && NCover.NCoverCheck.Add(105) && NCover.NCoverCheck.Add(105) && NCover.NCoverCheck.Add(105) && NCover.NCoverCheck.Add(105) && NCover.NCoverCheck.Add(105) && NCover.NCoverCheck.Add(105) && NCover.NCoverCheck.Add(105) && NCover.NCoverCheck.Add(105))
				{
					if (names.Length == 1 && NCover.NCoverCheck.Add(108) && NCover.NCoverCheck.Add(106) && NCover.NCoverCheck.Add(106) && NCover.NCoverCheck.Add(105) && NCover.NCoverCheck.Add(105) && NCover.NCoverCheck.Add(105) && NCover.NCoverCheck.Add(106) && NCover.NCoverCheck.Add(106) && NCover.NCoverCheck.Add(106) && NCover.NCoverCheck.Add(106) && NCover.NCoverCheck.Add(106) && NCover.NCoverCheck.Add(106) && NCover.NCoverCheck.Add(106) && NCover.NCoverCheck.Add(106))
					{
						NCover.NCoverCheck.Add(90); NCover.NCoverCheck.Add(89); NCover.NCoverCheck.Add(89); NCover.NCoverCheck.Add(88); NCover.NCoverCheck.Add(89); NCover.NCoverCheck.Add(89); NCover.NCoverCheck.Add(90); NCover.NCoverCheck.Add(90); NCover.NCoverCheck.Add(90); NCover.NCoverCheck.Add(90); NCover.NCoverCheck.Add(90); NCover.NCoverCheck.Add(90); NCover.NCoverCheck.Add(90); NCover.NCoverCheck.Add(90); return true;
					}
					else
					{
						string[] next = new string[names.Length -1];
						Array.Copy(names, 1, next, 0, next.Length);
						NCover.NCoverCheck.Add(91); NCover.NCoverCheck.Add(90); NCover.NCoverCheck.Add(90); NCover.NCoverCheck.Add(89); NCover.NCoverCheck.Add(90); NCover.NCoverCheck.Add(90); NCover.NCoverCheck.Add(91); NCover.NCoverCheck.Add(91); NCover.NCoverCheck.Add(91); NCover.NCoverCheck.Add(91); NCover.NCoverCheck.Add(91); NCover.NCoverCheck.Add(91); NCover.NCoverCheck.Add(91); NCover.NCoverCheck.Add(91); return cn.HasNamespace(next);
					}				
				}
			}

			NCover.NCoverCheck.Add(92); NCover.NCoverCheck.Add(91); NCover.NCoverCheck.Add(91); NCover.NCoverCheck.Add(90); NCover.NCoverCheck.Add(91); NCover.NCoverCheck.Add(91); NCover.NCoverCheck.Add(92); NCover.NCoverCheck.Add(92); NCover.NCoverCheck.Add(92); NCover.NCoverCheck.Add(92); NCover.NCoverCheck.Add(92); NCover.NCoverCheck.Add(92); NCover.NCoverCheck.Add(92); NCover.NCoverCheck.Add(92); return false;
		}

		public override bool Equals(object other)
		{
			CoverageNamespace cn = other as CoverageNamespace;
			if (cn == null && NCover.NCoverCheck.Add(107) && NCover.NCoverCheck.Add(107) && NCover.NCoverCheck.Add(106) && NCover.NCoverCheck.Add(106) && NCover.NCoverCheck.Add(106) && NCover.NCoverCheck.Add(107) && NCover.NCoverCheck.Add(107) && NCover.NCoverCheck.Add(107) && NCover.NCoverCheck.Add(107) && NCover.NCoverCheck.Add(107) && NCover.NCoverCheck.Add(107) && NCover.NCoverCheck.Add(107) && NCover.NCoverCheck.Add(107))
				return false;

			NCover.NCoverCheck.Add(93); NCover.NCoverCheck.Add(92); NCover.NCoverCheck.Add(92); NCover.NCoverCheck.Add(91); NCover.NCoverCheck.Add(92); NCover.NCoverCheck.Add(92); NCover.NCoverCheck.Add(93); NCover.NCoverCheck.Add(93); NCover.NCoverCheck.Add(93); NCover.NCoverCheck.Add(93); NCover.NCoverCheck.Add(93); NCover.NCoverCheck.Add(93); NCover.NCoverCheck.Add(93); NCover.NCoverCheck.Add(93); return cn.Namespace == Namespace;
		}

		public override int GetHashCode()
		{
			NCover.NCoverCheck.Add(94); NCover.NCoverCheck.Add(93); NCover.NCoverCheck.Add(93); NCover.NCoverCheck.Add(92); NCover.NCoverCheck.Add(93); NCover.NCoverCheck.Add(93); NCover.NCoverCheck.Add(94); NCover.NCoverCheck.Add(94); NCover.NCoverCheck.Add(94); NCover.NCoverCheck.Add(94); NCover.NCoverCheck.Add(94); NCover.NCoverCheck.Add(94); NCover.NCoverCheck.Add(94); NCover.NCoverCheck.Add(94); return _namespace.GetHashCode();
		}

		public string Namespace
		{
			get {
				if (_parent == null && NCover.NCoverCheck.Add(108) && NCover.NCoverCheck.Add(107) && NCover.NCoverCheck.Add(107) && NCover.NCoverCheck.Add(107) && NCover.NCoverCheck.Add(108))
					return _namespace;
				else
					return _parent.Namespace == DEFAULT_NAMESPACE? _namespace : _parent.Namespace + "." + _namespace;
			}
			set {
				//Could check for '.' and warn
				_namespace = value;
			}
		}

		/// <returns>ArrayList of CoverageNamespace</returns>
		[XmlIgnore]
		public ArrayList ChildNamespaces
		{
			get 
			{
				NCover.NCoverCheck.Add(95); NCover.NCoverCheck.Add(94); NCover.NCoverCheck.Add(94); NCover.NCoverCheck.Add(93); NCover.NCoverCheck.Add(94); NCover.NCoverCheck.Add(94); NCover.NCoverCheck.Add(95); NCover.NCoverCheck.Add(95); NCover.NCoverCheck.Add(95); NCover.NCoverCheck.Add(95); NCover.NCoverCheck.Add(95); NCover.NCoverCheck.Add(95); NCover.NCoverCheck.Add(95); NCover.NCoverCheck.Add(95); return _children;
			}
		}

		/// <summary>
		/// A list of files that are in this namespace
		/// </summary>
		[XmlArray]
		[XmlArrayItem(typeof(CoverageFile))]
		public ArrayList Members
		{
			get {
				NCover.NCoverCheck.Add(96); NCover.NCoverCheck.Add(95); NCover.NCoverCheck.Add(95); NCover.NCoverCheck.Add(94); NCover.NCoverCheck.Add(95); NCover.NCoverCheck.Add(95); NCover.NCoverCheck.Add(96); NCover.NCoverCheck.Add(96); NCover.NCoverCheck.Add(96); NCover.NCoverCheck.Add(96); NCover.NCoverCheck.Add(96); NCover.NCoverCheck.Add(96); NCover.NCoverCheck.Add(96); NCover.NCoverCheck.Add(96); return _members;
			}
		}

		public CoverageFile GetCoverageFile(string filename)
		{
			NCover.NCoverCheck.Add(97); NCover.NCoverCheck.Add(96); NCover.NCoverCheck.Add(96); NCover.NCoverCheck.Add(95); NCover.NCoverCheck.Add(96); NCover.NCoverCheck.Add(96); NCover.NCoverCheck.Add(97); NCover.NCoverCheck.Add(97); NCover.NCoverCheck.Add(97); NCover.NCoverCheck.Add(97); NCover.NCoverCheck.Add(97); NCover.NCoverCheck.Add(97); NCover.NCoverCheck.Add(97); NCover.NCoverCheck.Add(97); foreach (CoverageFile cf in Members)
			{
				if (cf.Filename == filename && NCover.NCoverCheck.Add(109) && NCover.NCoverCheck.Add(108) && NCover.NCoverCheck.Add(109) && NCover.NCoverCheck.Add(108) && NCover.NCoverCheck.Add(109) && NCover.NCoverCheck.Add(108) && NCover.NCoverCheck.Add(108) && NCover.NCoverCheck.Add(108) && NCover.NCoverCheck.Add(108) && NCover.NCoverCheck.Add(108) && NCover.NCoverCheck.Add(108) && NCover.NCoverCheck.Add(108))
				{
					NCover.NCoverCheck.Add(98); NCover.NCoverCheck.Add(97); NCover.NCoverCheck.Add(97); NCover.NCoverCheck.Add(96); NCover.NCoverCheck.Add(97); NCover.NCoverCheck.Add(97); NCover.NCoverCheck.Add(98); NCover.NCoverCheck.Add(98); NCover.NCoverCheck.Add(98); NCover.NCoverCheck.Add(98); NCover.NCoverCheck.Add(98); NCover.NCoverCheck.Add(98); NCover.NCoverCheck.Add(98); NCover.NCoverCheck.Add(98); return cf;
				}
			}
			NCover.NCoverCheck.Add(99); NCover.NCoverCheck.Add(98); NCover.NCoverCheck.Add(98); NCover.NCoverCheck.Add(97); NCover.NCoverCheck.Add(98); NCover.NCoverCheck.Add(98); NCover.NCoverCheck.Add(99); NCover.NCoverCheck.Add(99); NCover.NCoverCheck.Add(99); NCover.NCoverCheck.Add(99); NCover.NCoverCheck.Add(99); NCover.NCoverCheck.Add(99); NCover.NCoverCheck.Add(99); NCover.NCoverCheck.Add(99); return null;
		}

		/// <summary>
		/// The parent namespace.
		/// </summary>
		/// <example>System.Xml's parent is the System namespace</example>
		[XmlIgnore]
		public CoverageNamespace Parent {
			get {
				NCover.NCoverCheck.Add(100); NCover.NCoverCheck.Add(99); NCover.NCoverCheck.Add(99); NCover.NCoverCheck.Add(98); NCover.NCoverCheck.Add(99); NCover.NCoverCheck.Add(99); NCover.NCoverCheck.Add(100); NCover.NCoverCheck.Add(100); NCover.NCoverCheck.Add(100); NCover.NCoverCheck.Add(100); NCover.NCoverCheck.Add(100); NCover.NCoverCheck.Add(100); NCover.NCoverCheck.Add(100); NCover.NCoverCheck.Add(100); return _parent;
			}
			set {
				_parent = value;
			}
		}
	}
}














